package br.com.view;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.SplitPane;
import javafx.scene.control.TitledPane;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 * Esta classe é responsável pela estruturação da parte gráfica do projeto. Ela
 * se utiliza de outros grupos de classes para poder fazer esta estrutura.
 * 
 * @author Adam
 * @see Application
 * @see Ancora
 * @see Arvore
 * @see GradeCPU
 * @see GradeNode
 * @see Palco
 * @see Principal
 * @see Scroll
 * @see SplitH
 * @since 30/07/2014
 */
public class Principal extends Application {

	// Cria um split pane já pré configurado
	private SplitPane split = new SplitH();

	@Override
	public void start(Stage p) {

		// Cria o palco pré configurado
		Palco palco = new Palco();

		// Cria o container um nível abaixo da janela principal (do palco)
		AnchorPane painelAncoragem = new Ancora();

		// Cria os agrupamentos para serem inseridos no split
		StackPane direita = new StackPane();

		// Criando uma árvore TreeView agrupada em um stack
		StackPane arvore = new Arvore();

		// Cria um titled pane para incorporar um accordion
		// Para melhor organização foram criados boxes
		HBox caixaHorizontal = new HBox();
		VBox caixaVertical = new VBox();

		// Cria uma sequencia de TitledPane
		// Cria grids pane personalizados e os adiciona do titledpanes
		TitledPane titledPaneCPU = new TitledPaneCPU();
		GridPane gridPaneCPU = new GradeCPU();
		titledPaneCPU.setContent(gridPaneCPU);

		TitledPane titledPaneNode = new TitledPaneNode();
		GridPane gridPaneNode = new GradeNode();
		titledPaneNode.setContent(gridPaneNode);

		TitledPane titledPaneCartao = new TitledPaneCartao();
		GridPane gridPaneCartao = new GradeCartao();
		titledPaneCartao.setContent(gridPaneCartao);

		caixaVertical.getChildren().addAll(titledPaneCPU, titledPaneNode,
				titledPaneCartao);
		caixaHorizontal.getChildren().add(caixaVertical);

		direita.getChildren().addAll(caixaHorizontal);

		// Adicionando os nodes ao split
		split.getItems().addAll(arvore, direita);

		painelAncoragem.getChildren().add(split);

		palco.getGrupoRaiz().getChildren().add(painelAncoragem);

		// Adicionando um listener para o redimensionamento do palco
		palco.widthProperty().addListener(new ChangeListener<Number>() {

			@Override
			public void changed(ObservableValue<? extends Number> observable,
					Number oldValue, Number newValue) {
				Principal.this.split.setPrefWidth(newValue.doubleValue() - 35);
				Principal.this.split.setDividerPositions(0.1);

			}
		});

		palco.heightProperty().addListener(new ChangeListener<Number>() {

			@Override
			public void changed(ObservableValue<? extends Number> observable,
					Number oldValue, Number newValue) {
				Principal.this.split.setPrefHeight(newValue.doubleValue() - 60);

			}
		});

		palco.show();

	}

	/**
	 * Método principal do projeto
	 * 
	 * @param args
	 *            É a própria Thread do JavaFx
	 */
	public static void main(String[] args) {
		launch(args);
	}
}
